#include<iostream>
#include<signal.h>
#include<unistd.h>
using namespace std;


void Printpending(sigset_t& pending)
{
    for(int signo=31;signo>=1;signo--)
    {
        if(sigismember(&pending,signo)) cout<<'1';
        else cout<<'0';
    }
    cout<<endl;
}
int main()
{
    //1.先对2号信号进行屏蔽
    //1.1  数据储备
    sigset_t bset,oset;// 在哪里开辟的空间？？？用户栈上的，属于用户区
    sigemptyset(&bset);
    sigemptyset(&oset);

    sigaddset(&bset,2);//我们已经把2号信号屏蔽了吗？  其实没有，并没有设置到系统的block表里
    //1.2调用系统调用，把2号信号屏蔽弄进内核里
    sigprocmask(SIG_SETMASK,&bset,&oset);

    //2.重复打印pending表
    sigset_t pending;
    int cnt=0;
    while(true)
    {
        //2.1获取pending表
        int n=sigpending(&pending);
        if(n<0) continue;
        //2.3打印pending表
        Printpending(pending);
        cnt++;
        sleep(1);
        if(cnt==6)
        {
            //2.3解除对二号信号的屏蔽
            cout << "unblock 2 signo" << endl;
            // sigdelset(&bset,2);
            // sigprocmask(SIG_SETMASK,&bset,&oset);

            //或者这样
            sigprocmask(SIG_SETMASK,&oset,nullptr);   //oset保存的是上一次的block表

        }
    }
     //3.发送信号

    return 0;
}